细节层次原理
LOD 使用树结构,其中最顶层的节点是一个非常粗糙的几何结构,子节点是逐渐精细的几何结构。叶节点是三维表示的最细粒度。
以下是 LOD 树的示例,其中每个节点均包含几何结构和纹理。与点云 LOD 表示不同,子节点包含完整的格网模型规范,可完全取代父格网模型。
例如,第 2 层节点分割成 2 个子节点,每个子节点包含模型的一半,但比例比父节点更精细。显示第 3 层节点时,应当隐藏第 2 层节点。
这些节点将根据与屏幕的接近程度显示。仍以我们的示例为例,当远离屏幕时,将显示节点 A(第 1 层)。离屏幕越来越近时,这些节点将被其子节点取代。例如,节点 B 将取代节点 A,节点 C 和 D 将取代节点 B。如果放大节点 C,可能会发现节点 C 将被第 4 层的节点 E 和 F 取代,而其同级节点 D 保持不变。
在节点替换为其子节点的过程中,可能会出现节点必须消失的现象,没有任何几何结构取代它。或者,格网模型简化可能会减少,形成一个父节点不含三角形的节点几何结构。这两种情况都需要空节点。LOD 表示中有时可能会出现空节点,我们应考虑到这一点。
在任何给定时间,仅显示可能的树路径中的一个节点。在 LOD 示例中,如果显示节点 B,则不会显示第 1 层节点,也不会显示节点 B 的任何后代。
现在的问题是,特定节点何时近到正好显示在屏幕上?对于这一点,ContextCapture(Viewer 或 Web Viewer)方法要考虑节点在屏幕上显示的大小(以像素为单位)。要提高计算速度,可将该节点的边界球体用作代理。边界球体在屏幕上的投影是一个直径为 d 的圆。直径 d 用于衡量该节点在屏幕上的显示大小。
每个节点都附加了最大屏幕直径(像素)。此值表示节点应可见的投影边界球体直径 d 的最大值。一旦超过此值,该节点应替换为其子节点。
在上述示例中,只要边界球体在屏幕上的投影是一个直径小于 40 像素的圆,就会显示节点 A。如果边界球体投影变得太大,则会加载和显示节点 B。
慢慢靠近模型时,将逐渐过渡到树结构中更高分辨率的节点,但仅限可见区域!这意味着当分辨率较高时,内存中仅加载树的一小部分。
在我们的示例中,当相机放大节点 D 时,节点 E 和 F 变为不可见。因此,尽管在高分辨率下需要模型的 D 部分,但节点 C、E 和 F 不再有用。为了最大程度地减少内存消耗,应将这些节点删除。
通常,如果某个节点在一段时间内处于不可见状态,则会将其删除。在变为不可见之后,这些节点不会立即删除,因为如果相机稍微移动一下,它们很有可能会再次可见。延迟删除可确保不太可能很快就需要这些节点。仅当仍然需要任何子节点时才不会删除节点。
ContextCapture(Viewer 或 Web Viewer)数据的 LOD 可视化的主要原理如下: